# 前面讲的类方法，静态方法等背后的实现基数都是依赖于描述符的

# 描述符协议
# 只要实现了__get__(拦截对象的读取),__set__(拦截对象的写入),__delete__(拦截对象的删除)这3个任意方法的类就叫做描述符
# 但是跟之前接触的魔法方法不同，因为他们管的不是自家的属性，而是别人家的属性


class Descriptor:

    def __get__(self, instance, owner):
        print(f"get~\nself -> {self}\ninstance -> {instance}\nowner -> {owner}")

    def __set__(self, instance, value):
        print(f"set~\nself -> {self}\ninstance -> {instance}\nvalue -> {value}")

    def __delete__(self, instance):
        print(f"delete~\nself -> {self}\ninstance -> {instance}")


# 此时，D就是描述符
# 如何启动呢？只需要在另一个类中，将他的实例化对象赋值给想要管理的属性即可
class C:
    # 描述符D
    # 管理的属性 x
    # 如何启动呢？只需要在另一个类中，将他的实例化对象赋值给想要管理的属性即可
    x = Descriptor()


print("================================================================================" * 3)

c = C()
c.x = 250
# set~
# self -> <__main__.Descriptor object at 0x1009e0fd0>
# instance -> <__main__.C object at 0x1009e0ee0>
# value -> 250

print("================================================================================" * 3)

r = c.x
# get~
# self -> <__main__.Descriptor object at 0x1009e0fd0>
# instance -> <__main__.C object at 0x1009e0ee0>
# owner -> <class '__main__.C'>

print("================================================================================" * 3)

del c.x
# delete~
# self -> <__main__.Descriptor object at 0x1009e0fd0>
# instance -> <__main__.C object at 0x1009e0ee0>
